home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / components / flockDateFormatter.js < prev    next >
Text File  |  2007-10-12  |  7KB  |  235 lines

  1. // vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab
  2. //
  3. // BEGIN FLOCK GPL
  4. // 
  5. // Copyright Flock Inc. 2005-2007
  6. // http://flock.com
  7. // 
  8. // This file may be used under the terms of of the
  9. // GNU General Public License Version 2 or later (the "GPL"),
  10. // http://www.gnu.org/licenses/gpl.html
  11. // 
  12. // Software distributed under the License is distributed on an "AS IS" basis,
  13. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  14. // for the specific language governing rights and limitations under the
  15. // License.
  16. // 
  17. // END FLOCK GPL
  18. //
  19.  
  20. const DF_CONTRACTID = '@flock.com/date-formatter;1';
  21. const DF_CLASSID    = Components.ID('3c4c0b89-82e0-4d08-938c-6d5ede31a784');
  22. const DF_CLASSNAME  = 'Flock Date Formatter';
  23.  
  24. const URI_DF_PROPERTIES = 'chrome://flock/locale/common/flockDateFormatter.properties';
  25.  
  26.  
  27. const Cc = Components.classes;
  28. const Ci = Components.interfaces;
  29. const Cr = Components.results;
  30.  
  31.  
  32. function getObserverService() {
  33.   return Cc['@mozilla.org/observer-service;1']
  34.     .getService(Ci.nsIObserverService);
  35. }
  36.  
  37.  
  38. const MSECS_PER_DAY = 24 * 60 * 60 * 1000;
  39.  
  40. function DateFormatter() {
  41.   var obs = getObserverService();
  42.   obs.addObserver(this, 'profile-after-change', false);
  43. }
  44.  
  45. DateFormatter.prototype = {
  46.   _start: function DF__start() {
  47.     var sbs = Cc['@mozilla.org/intl/stringbundle;1']
  48.       .getService(Ci.nsIStringBundleService);
  49.     var bundle = sbs.createBundle(URI_DF_PROPERTIES);
  50.  
  51.     this._pureDateTimeFormat = bundle.GetStringFromName('time');
  52.     this._reallyShortFormat  = bundle.GetStringFromName('time.veryshort');
  53.     this._mediumShortFormat  = bundle.GetStringFromName('time.medshort');
  54.  
  55.     for each (var t in ['tomorrow', 'today', 'yesterday']) {
  56.       var tstr = bundle.GetStringFromName(t);
  57.  
  58.       this['_' + t + 'String'] = tstr;
  59.  
  60.       this['_' + t + 'DateTimeFormat'] =
  61.         bundle.formatStringFromName('timeShort', [tstr], 1);
  62.     }
  63.   },
  64.  
  65.   observe: function DF_observe(subject, topic, state) {
  66.     var obs = getObserverService();
  67.  
  68.     switch (topic) {
  69.       case 'profile-after-change':
  70.         obs.removeObserver(this, 'profile-after-change');
  71.         this._start();
  72.         break;
  73.     }
  74.   },
  75.  
  76.   getTimeString: function DF_getTimeString(time) {
  77.     var date = new Date(time);
  78.     return date.toLocaleFormat('%I:%M %p').replace(/^0/, '');
  79.   },
  80.   getDateString: function DF_getDateString(time) {
  81.     var date = new Date(time);
  82.  
  83.     var now = new Date();
  84.     var now_date = new Date(now.toDateString());
  85.  
  86.     if (date.getTime() >= (now_date.getTime() + 2 * MSECS_PER_DAY))
  87.       return date.toLocaleFormat('%A, %B %d, %Y').replace(' 0', ' ');
  88.     else if (date.getTime() >= (now_date.getTime() + MSECS_PER_DAY))
  89.       return this._tomorrowString;
  90.     else if (date.getTime() >= now_date.getTime())
  91.       return this._todayString; 
  92.     else if (date.getTime() >= (now_date.getTime() - MSECS_PER_DAY))
  93.       return this._yesterdayString;
  94.     else
  95.       return date.toLocaleFormat('%A, %B %d, %Y').replace(' 0', ' ');
  96.   },
  97.   
  98.   getDateTimeString: function DF_getDateTimeString(time) {
  99.     var date = new Date(time);
  100.     var now = new Date();
  101.  
  102.     return this._getDateTimeStringHelper(date, now, this._pureDateTimeFormat);
  103.   },
  104.  
  105.   getShortDateTimeString: function DF_getShortDateTimeString(time) {
  106.     var date = new Date(time);
  107.     var now = new Date();
  108.  
  109.     var format;
  110.     if (date.getYear() == now.getYear())
  111.       format = this._reallyShortFormat;
  112.     else
  113.       format = this._mediumShortFormat;
  114.  
  115.     return this._getDateTimeStringHelper(date, now, format);
  116.   },
  117.  
  118.   _getDateTimeStringHelper: function DF_getDateTimeStringHelper(date, now,
  119.                                                                 format) {
  120.     var datetime;
  121.     var now_date = new Date(now.toDateString());
  122.  
  123.     if (date.getTime() >= (now_date.getTime() + 2 * MSECS_PER_DAY))
  124.       datetime = date.toLocaleFormat(format);
  125.     else if (date.getTime() >= (now_date.getTime() + MSECS_PER_DAY))
  126.       datetime = date.toLocaleFormat(this._tomorrowDateTimeFormat);
  127.     else if (date.getTime() >= now_date.getTime())
  128.       datetime = date.toLocaleFormat(this._todayDateTimeFormat);
  129.     else if (date.getTime() >= (now_date.getTime() - MSECS_PER_DAY))
  130.       datetime = date.toLocaleFormat(this._yesterdayDateTimeFormat);
  131.     else
  132.       datetime = date.toLocaleFormat(format);
  133.  
  134.     return datetime.replace(/ 0/g, ' ');
  135.   },
  136.  
  137.   getInterfaces: function DF_getInterfaces(countRef) {
  138.     var interfaces =
  139.         [Ci.flockIDateFormatter, Ci.nsIObserver,
  140.          Ci.nsIClassInfo, Ci.nsISupports];
  141.     countRef.value = interfaces.length;
  142.     return interfaces;
  143.   },
  144.   getHelperForLanguage: function DF_getHelperForLanguage(language) {
  145.     return null;
  146.   },
  147.   contractID: DF_CONTRACTID,
  148.   classDescription: DF_CLASSNAME,
  149.   classID: DF_CLASSID,
  150.   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
  151.   flags: Ci.nsIClassInfo.SINGLETON,
  152.  
  153.   QueryInterface: function DF_QueryInterface(iid) {
  154.     if (iid.equals(Ci.flockIDateFormatter) ||
  155.         iid.equals(Ci.nsIObserver) ||
  156.         iid.equals(Ci.nsIClassInfo) ||
  157.         iid.equals(Ci.nsISupports))
  158.       return this;
  159.     throw Cr.NS_ERROR_NO_INTERFACE;
  160.   }
  161. }
  162.  
  163.  
  164. function GenericComponentFactory(ctor) {
  165.   this._ctor = ctor;
  166. }
  167.  
  168. GenericComponentFactory.prototype = {
  169.  
  170.   _ctor: null,
  171.  
  172.   // nsIFactory
  173.   createInstance: function(outer, iid) {
  174.     if (outer != null)
  175.       throw Cr.NS_ERROR_NO_AGGREGATION;
  176.     return (new this._ctor()).QueryInterface(iid);
  177.   },
  178.  
  179.   // nsISupports
  180.   QueryInterface: function(iid) {
  181.     if (iid.equals(Ci.nsIFactory) ||
  182.         iid.equals(Ci.nsISupports))
  183.       return this;
  184.     throw Cr.NS_ERROR_NO_INTERFACE;
  185.   },
  186. };
  187.  
  188. var Module = {
  189.   QueryInterface: function(iid) {
  190.     if (iid.equals(Ci.nsIModule) ||
  191.         iid.equals(Ci.nsISupports))
  192.       return this;
  193.  
  194.     throw Cr.NS_ERROR_NO_INTERFACE;
  195.   },
  196.  
  197.   getClassObject: function(cm, cid, iid) {
  198.     if (!iid.equals(Ci.nsIFactory))
  199.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  200.  
  201.     if (cid.equals(DF_CLASSID))
  202.       return new GenericComponentFactory(DateFormatter);
  203.  
  204.     throw Cr.NS_ERROR_NO_INTERFACE;
  205.   },
  206.  
  207.   registerSelf: function(cm, file, location, type) {
  208.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  209.     cr.registerFactoryLocation(DF_CLASSID,
  210.                                DF_CLASSNAME,
  211.                                DF_CONTRACTID,
  212.                                file, location, type);
  213.  
  214.     var catman = Cc['@mozilla.org/categorymanager;1']
  215.       .getService(Ci.nsICategoryManager);
  216.     catman.addCategoryEntry('app-startup', DF_CLASSNAME,
  217.                             'service,' + DF_CONTRACTID,
  218.                             true, true);
  219.   },
  220.  
  221.   unregisterSelf: function(cm, location, type) {
  222.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  223.     cr.unregisterFactoryLocation(DF_CLASSID, location);
  224.   },
  225.  
  226.   canUnload: function(cm) {
  227.     return true;
  228.   },
  229. };
  230.  
  231. function NSGetModule(compMgr, fileSpec)
  232. {
  233.   return Module;
  234. }
  235.